/**
* @version:1.0
* @author kevinnan.org.cn  2018212114@mail.hfut.edu.cn
* @date 2020/8/1
* @Content:频率域滤波
*/

#ifndef FREQUENCY_FILTER_H
#define FREQUENCY_FILTER_H

#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include "gray_transform.hpp"
using namespace std;

namespace frequencyfilter{

class frequencyFiltering{
private:
	//输入图像
	cv::Mat inputImage;
	//傅里叶变换结果
	cv::Mat fourierTransformImage;
public:	

	frequencyFiltering(cv::Mat image);
	/**
	  * 傅里叶变换
	  */
	cv::Mat fourierTransform(const cv::Mat& originImage);

	/**
	  * 傅里叶逆变换
	  */
	cv::Mat inverseFourierTransform(const cv::Mat& fourierImage);

	/**
	  * 得到傅里叶变换后的幅度谱
	  */
	cv::Mat getMagnitudeImage(const cv::Mat& fourierImage);

	/**
	  * 将幅度谱中心化
	  */
	cv::Mat changeCenter(const cv::Mat& magImage);

	/**
	  * 得到傅里叶变换后的相位谱
	  */
	cv::Mat getPhaseImage(const cv::Mat& fourierImage);

	/**
	  * 理想低通滤波器
	  * D0为理想低通滤波器半径
	  */
	cv::Mat idealLowPassFilter(float D0=100);


	/**
	  * 布特沃斯低通滤波器
	  * D0为理想低通滤波器半径
	  */
	cv::Mat butterworthLowPassFilter(float D0=100, int n=1);


	/**
	  * 高斯低通滤波器
	  * D0为高斯低通滤波器半径，即截止频率
	  */
	cv::Mat guassLowPassFilter(float D0=50);


	/**
	  * 理想高通滤波器
	  * D0为理想高通滤波器半径
	  */
	cv::Mat idealHighPassFilter(float D0=50);


	/**
	  * 布特沃斯高通滤波器
	  * D0为理想高通滤波器半径
	  */
	cv::Mat butterworthHighPassFilter(float D0=100, int n=1);


	/**
	  * 高斯高通滤波器
	  * D0为高斯高通滤波器半径，即截止频率
	  */
	cv::Mat guassHighPassFilter(float D0=50);


	/**
	  * 高斯高通滤波器
	  * D0为高斯高通滤波器半径，即截止频率
	  */
	cv::Mat homomorphicFilter(float low=0.25, float high=2, float D0=80);


};
	
}
#endif